\section{复杂的C语言声明语法}

\subsection{声明的语法构成}
以下内容为声明语句的语法构成，选自《C专家编程》
\begin{lstlisting}
声明语句：
至少一个类型说明符(type-specifier) 存储类型(storage-class) 类型限定符(type-qualifier) 一个或多个声明器(declarator) 一个分号

声明器：
指针 直接声明器 初始化内容
\end{lstlisting}

类型说明符：
\begin{enumerate}
    \item char, short, int, long, double, float, signed, unsigned, void 
    \item 结构说明符(struct-specifier)
    \item 枚举说明符(enum-specifier)
    \item 联合说明符(union-specifier)
\end{enumerate}

存储类型：extern, static, register, auto, typedef

类型限定符：const, volatile

指针(星号，后面可有volatile或/和const符号，顺序不限)：
\begin{lstlisting}
    * [volatile][const]
\end{lstlisting}

直接声明器：
\begin{enumerate}
    \item 标识符
    \item 标识符[下标]
    \item 标识符(参数)
    \item (声明)
\end{enumerate}

初始化内容：\verb|=初始值|

\subsection{声明语句的解析}
声明语句分解的优先级规则为：
\begin{itemize}
    \item 从最左标识符开始读取
    \item 优先级从高到低依次是： 
        \begin{itemize}
            \item 将多个部分组在一起的括号 
            \item 表示函数的小括号(输出a function returning\dots)和表示数组的方括号(an array of \dots)，两者至多出现一个 
            \item 前缀的星号，输出pointer to \dots
        \end{itemize}
    \item const和volatile 如果在类型描述符之后(英文原文是next to，可能是相邻的意思，包括之前)则类型限定符被应用于(apply to)类型描述符，否则应用于恰在其左侧的星号。 
\end{itemize}

\subsection{例子}
\begin{enumerate}
    \item \verb|char *const *(*next)();|表示``next is a pointer to a function returning a pointer to a const pointer-to-char''。
    \item \verb|int (*a[10])(int);|表示a是一个数组，数组每个元素都是都是指向函数的指针
    \item \verb|int a[5];|\&为指向数组的指针，\&a+1指向数组最末元素之后的不可访问的位置。
\end{enumerate}
















